package br.com.velp.sudecap.mb.usuario;

import br.com.velp.sudecap.comum.BaseController;
import br.com.velp.sudecap.comum.InterfaceCadastro;
import br.com.velp.sudecap.entidade.*;
import br.com.velp.sudecap.enumerator.EnumSimNao;
import br.com.velp.sudecap.enumerator.PaginaEnum;
import br.com.velp.sudecap.enumerator.TipoMensagemEnum;
import br.com.velp.sudecap.service.*;
import br.com.velp.sudecap.util.JasperUtil;
import br.com.velp.sudecap.util.MensagemUtil;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.faces.model.SelectItem;
import org.lindbergframework.spring.scope.AccessScoped;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * <sumario>
 * <objetivo>"Rastreabilidade"</objetivo>
 * <autor>EDUARDO SANTOS DE OLIVEIRA</autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 07.11.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <requisito_afetado> RF001.03 - Cadastrar Usuários </requisito_afetado>
 * <descricao> Managead Bean responsável por controlar as operações de
 *             Inclusão/Alteração/Detalhamento de Usuários </descricao>
 * </sumario>
 */
@Controller("manterUsuario")
@AccessScoped
public class ManterUsuario extends BaseController implements InterfaceCadastro {
    
    public static final Long serialVersionUID = 1L;

    private Usuario usuario;
    private List<SelectItem> listaDiretorias;
    private List<SelectItem> listaSetores;
    private List<SelectItem> listaLocais;
    private List<SelectItem> listaAndares;
    private List<SelectItem> listaAtivosSimNao;
    private String campoRepitaSenha;
    private Long idUsuarioSelecionado;
    private boolean isDetalhamento;
    
    @Autowired
    private UsuarioService usuarioService;
    
    @Autowired
    private AndarService andarService;
    
    @Autowired
    private SetorService setorService;
    
    @Autowired
    private DiretoriaService diretoriaService;
    
    @Autowired
    private LocalService localService;

    @Override
    public String setup() {

        inicializar();
        
	return PaginaEnum.MANTER_USUARIO.getValue();

    }

    @Override
    public String editSetup() {

	String pagina = setup();
	this.usuario = this.usuarioService.obterPorId(this.idUsuarioSelecionado);
	this.campoRepitaSenha = this.usuario.getSenha();

	return pagina;

    }

    @Override
    public String detalhar() {

	String pagina = editSetup();
	this.isDetalhamento = true;

	return pagina;

    }

    @Override
    public String salvar() throws Exception {

	try {
	    
	    if(!this.usuario.getSenha().equals(this.campoRepitaSenha)){
		MensagemUtil.exibirMensagemAlerta(MensagemUtil.getMensagem("usuarioCamposSenhaNaoConferem"));
		return null;
	    }
	    
	    if (this.usuario.getId() == null) {
		this.usuario.setDataCadastro(new Date());
		this.usuario.setIdUsuarioCadastro(getContexto().getUsuario().getId());
		this.usuario.setId(this.usuarioService.salvar(this.usuario));
	    } else {
		this.usuario.setDataAlteracao(new Date());
		this.usuario.setIdUsuarioAlteracao(getContexto().getUsuario().getId());
		this.usuarioService.atualizar(this.usuario);
	    }

            this.campoRepitaSenha = this.usuario.getSenha();
	    this.isDetalhamento = true;

	    MensagemUtil.exibirMensagemInformacao(MensagemUtil.getMensagem("registro_salvo_sucesso"));
	    
	} catch (Exception e) {
	    
            tratarExcessao(e);
            
	}

	return null;

    }

    @Override
    public String voltar() {
	
	return PaginaEnum.CONSULTAR_USUARIO.getValue();
	
    }
    
    public void inicializar(){
        
	this.campoRepitaSenha = null;
	this.usuario = new Usuario();
	this.isDetalhamento = false;
        
	carregarCombos();
        
    }
    
    public void controlarSelecaoCampoAndar() {
        
        Andar andar = this.usuario.getAndar();
        
        if (andar == null) {
            return;
        }
        
        andar = this.andarService.obterPorId(andar.getId());
        
        if (!andar.isAtivo()) {
            this.usuario.setAndar(null);
            exibirMensagem(TipoMensagemEnum.ERRO, MensagemUtil.getMensagem("geral_proibida_selecao_item_inativo"));
        }
        
    }
    
    public void controlarSelecaoCampoDiretoria() {
        
        Diretoria diretoria = this.usuario.getDiretoria();
        
        if (diretoria == null) {
            return;
        }
        
        diretoria = this.diretoriaService.obterPorId(diretoria.getId());
        
        if (!diretoria.isAtivo()) {
            this.usuario.setDiretoria(null);
            exibirMensagem(TipoMensagemEnum.ERRO, MensagemUtil.getMensagem("geral_proibida_selecao_item_inativo"));
        }
        
    }
    
    public void controlarSelecaoCampoLocal() {
        
        Local local = this.usuario.getLocal();
        
        if (local == null) {
            return;
        }
        
        local = this.localService.obterPorId(local.getId());
        
        if (!local.isAtivo()) {
            this.usuario.setLocal(null);
            exibirMensagem(TipoMensagemEnum.ERRO, MensagemUtil.getMensagem("geral_proibida_selecao_item_inativo"));
        }
        
    }
    
    public void controlarSelecaoCampoSetor() {
        
        Setor setor = this.usuario.getSetor();
        
        if (setor == null) {
            return;
        }
        
        setor = this.setorService.obterPorId(setor.getId());
        
        if (!setor.isAtivo()) {
            this.usuario.setSetor(null);
            exibirMensagem(TipoMensagemEnum.ERRO, MensagemUtil.getMensagem("geral_proibida_selecao_item_inativo"));
        }
        
    }
    
    private void carregarCombos(){
	
        this.listaAtivosSimNao = obterSelectItemPopulado(Boolean.TRUE, EnumSimNao.values());
        
        carregarComboAndares();
        carregarComboDiretorias();
        carregarComboLocais();
        carregarComboSetores();
	
    }
    
    private void carregarComboAndares() {
        
        this.listaAndares = obterSelectItemInicializado();
        List<Andar> andares = this.andarService.obterTodosAndares(false);
        
        for (Andar andar : andares) {
            this.listaAndares.add(new SelectItem(andar.getId(), 
                    concatenarInformacaoInativo(andar.getNumero().toString(), andar.isAtivo())));
        }
        
    }
    
    private void carregarComboDiretorias() {
        
        this.listaDiretorias = obterSelectItemInicializado();
        List<Diretoria> diretorias = this.diretoriaService.obterTodasDiretorias(false);
        
        for (Diretoria diretoria : diretorias) {
            this.listaDiretorias.add(new SelectItem(diretoria.getId(), 
                    concatenarInformacaoInativo(diretoria.getNome(), diretoria.isAtivo())));
        }
        
    }
    
    private void carregarComboLocais() {
        
        this.listaLocais = obterSelectItemInicializado();
        List<Local> locais = this.localService.obterTodosLocais(false);
        
        for (Local local : locais) {
            this.listaLocais.add(new SelectItem(local.getId(), 
                    concatenarInformacaoInativo(local.getNome(), local.isAtivo())));
        }
        
    }
    
    private void carregarComboSetores() {
        
        this.listaSetores = obterSelectItemInicializado();
        List<Setor> setores = this.setorService.buscarTodosSetores(false);
        
        for (Setor setor : setores) {
            this.listaSetores.add(new SelectItem(setor.getId(), 
                    concatenarInformacaoInativo(setor.getNome(), setor.isAtivo())));
        }
        
    }
    
    private String concatenarInformacaoInativo(String value, boolean ativo) {
        
        String info = "";
        info += value;
        
        if (!ativo) {
            info += " (inativo)";
        }
        
        return info;
        
    }
    
    private HashMap<String, Object> getParametrosIreport(){
        
        HashMap<String, Object> parametros = obterParametrosPadraoRelatorios();
        parametros.put("TITULO", "CADASTRO DE USUÁRIOS");
        
        return parametros;
        
    }
    
    public String exportarCadastroXLS(){
        
        this.usuario = this.usuarioService.obterPorId(this.usuario.getId());
        
        List usuario = new ArrayList();
        usuario.add(this.usuario);
        
        JasperUtil.gerarArquivoXLS(
                "/relatorios/export_cadastro/usuario/Cadastro_Usuario.jasper", 
                "Cadastro_Usuario", 
                usuario, 
                getParametrosIreport());
        
        return null;
        
    }
    
    public String exportarCadastroPDF(){
        
        this.usuario = this.usuarioService.obterPorId(this.usuario.getId());
        
        List usuario = new ArrayList();
        usuario.add(this.usuario);
        
        JasperUtil.gerarArquivoPDF(
                "/relatorios/export_cadastro/usuario/Cadastro_Usuario.jasper", 
                "Cadastro_Usuario", 
                usuario, 
                getParametrosIreport());
        
        return null;
        
    }
    
    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">   
    public String getCampoRepitaSenha() {
        return campoRepitaSenha;
    }

    public void setCampoRepitaSenha(String campoRepitaSenha) {
        this.campoRepitaSenha = campoRepitaSenha;
    }

    public DiretoriaService getDiretoriaService() {
        return diretoriaService;
    }

    public void setDiretoriaService(DiretoriaService diretoriaService) {
        this.diretoriaService = diretoriaService;
    }

    public Long getIdUsuarioSelecionado() {
        return idUsuarioSelecionado;
    }

    public void setIdUsuarioSelecionado(Long idUsuarioSelecionado) {
        this.idUsuarioSelecionado = idUsuarioSelecionado;
    }

    public boolean isIsDetalhamento() {
        return isDetalhamento;
    }

    public void setIsDetalhamento(boolean isDetalhamento) {
        this.isDetalhamento = isDetalhamento;
    }

    public List<SelectItem> getListaAndares() {
        return listaAndares;
    }

    public void setListaAndares(List<SelectItem> listaAndares) {
        this.listaAndares = listaAndares;
    }

    public List<SelectItem> getListaAtivosSimNao() {
        return listaAtivosSimNao;
    }

    public void setListaAtivosSimNao(List<SelectItem> listaAtivosSimNao) {
        this.listaAtivosSimNao = listaAtivosSimNao;
    }

    public List<SelectItem> getListaDiretorias() {
        return listaDiretorias;
    }

    public void setListaDiretorias(List<SelectItem> listaDiretorias) {
        this.listaDiretorias = listaDiretorias;
    }

    public List<SelectItem> getListaLocais() {
        return listaLocais;
    }

    public void setListaLocais(List<SelectItem> listaLocais) {
        this.listaLocais = listaLocais;
    }

    public List<SelectItem> getListaSetores() {
        return listaSetores;
    }

    public void setListaSetores(List<SelectItem> listaSetores) {
        this.listaSetores = listaSetores;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    // </editor-fold>        
   
}
